package com.scheduling.order.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.scheduling.order.entity.Order;
import com.scheduling.order.entity.dto.OrderDTO;

import java.time.LocalDate;
import java.util.List;

/**
 * 订单服务接口
 *
 * @author 开发团队
 * @since 2025-05-29
 */
public interface IOrderService extends IService<Order> {

    /**
     * 创建订单（包含客户信息和订单项）
     *
     * @param orderDTO 订单数据传输对象
     * @return 创建的订单详情
     */
    OrderDTO createOrder(OrderDTO orderDTO);

    /**
     * 更新订单
     *
     * @param orderDTO 订单数据传输对象
     * @return 更新后的订单详情
     */
    OrderDTO updateOrder(OrderDTO orderDTO);

    /**
     * 根据订单ID删除订单（级联删除订单项）
     *
     * @param orderId 订单ID
     * @return 是否删除成功
     */
    boolean deleteOrder(String orderId);

    /**
     * 根据订单ID查询订单详情（包含客户信息和订单项列表）
     *
     * @param orderId 订单ID
     * @return 订单详情
     */
    OrderDTO getOrderDetail(String orderId);

    /**
     * 分页查询订单列表
     *
     * @param current      当前页
     * @param size         页大小
     * @param customerName 客户名称（模糊查询）
     * @param status       订单状态
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 分页结果
     */
    Page<OrderDTO> getOrderPage(long current, long size,
                                String customerName, String status,
                                LocalDate startDate, LocalDate endDate);

    /**
     * 查询指定状态的订单列表
     *
     * @param status 订单状态
     * @return 订单列表
     */
    List<OrderDTO> getOrdersByStatus(String status);

    /**
     * 查询逾期订单列表
     *
     * @return 逾期订单列表
     */
    List<OrderDTO> getOverdueOrders();

    /**
     * 更新订单状态
     *
     * @param orderId 订单ID
     * @param status  新状态
     * @return 是否更新成功
     */
    boolean updateOrderStatus(String orderId, String status);

    /**
     * 根据订单项完成情况自动更新订单状态
     *
     * @param orderId 订单ID
     */
    void updateOrderStatusByItems(String orderId);

    /**
     * 检查并更新订单的生产进度
     *
     * @param orderId 订单ID
     */
    void refreshOrderProgress(String orderId);

    /**
     * 获取待生产的订单列表（用于排产）
     *
     * @return 待生产订单列表
     */
    List<OrderDTO> getPendingOrders();

    /**
     * 批量更新订单状态
     *
     * @param orderIds 订单ID列表
     * @param status   新状态
     * @return 更新成功的数量
     */
    int batchUpdateOrderStatus(List<String> orderIds, String status);
} 